package main

import "fmt"

// Parent 定义一个父类
type Parent struct {
	name string
}

// SayHello 父类的方法
func (p *Parent) SayHello() {
	fmt.Println("Hello, I am", p.name)
}

// Child 定义一个子类
type Child struct {
	Parent // 嵌入父类(不写变量名，直接嵌入的类名)
}

// SayGoodbye 定义Child结构体的方法
func (c *Child) SayGoodbye() {
	fmt.Println("Goodbye from", c.name)
}

func main() {
	// 创建子类对象，通常应该是不写&，除非需要修改内部字段值
	// & 表示生成一个结构体指针，后面可以通过child来修改结构体的字段值
	child := &Child{
		Parent: Parent{
			name: "Alice",
		},
	}

	// 调用继承的方法
	child.SayHello()   // Hello, I am Alice
	child.SayGoodbye() // Goodbye from Alice
}
